package org.suwenqian.airoleplayingchatbackend.common.redis.mem;


import lombok.RequiredArgsConstructor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.messages.Message;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

@Component // 将其声明为Spring管理的组件
@RequiredArgsConstructor
public class RedisChatMemory implements ChatMemory {

    private final RedisTemplate<String, Object> redisTemplate;

    // Redis Key 的前缀，用于区分其他业务数据
    private static final String REDIS_KEY_PREFIX = "chat:memory:";

    // 消息的过期时间，例如设置为30天
    private static final long EXPIRATION_TIME = 30;
    private static final TimeUnit EXPIRATION_UNIT = TimeUnit.DAYS;

    @Override
    public void add(String conversationId, List<Message> messages) {
        String key = REDIS_KEY_PREFIX + conversationId;
        // 将消息列表存入Redis。这里使用rightPushAll，表示按顺序追加到列表尾部。
        redisTemplate.opsForList().rightPushAll(key, messages.toArray());
        // 为整个对话列表设置过期时间
        redisTemplate.expire(key, EXPIRATION_TIME, EXPIRATION_UNIT);
    }

    @Override
    public List<Message> get(String conversationId) {
        String key = REDIS_KEY_PREFIX + conversationId;
        // 获取列表总长度
        Long size = redisTemplate.opsForList().size(key);
        if (size == null || size == 0) {
            return List.of(); // 返回空列表
        }
        // 计算起始索引，获取最后 lastN 条消息
        // 例如：size=10, lastN=5 -> start=5, 获取索引5到9的元素（共5个）
        Long lastN = 5L;
        int start = (int) (size - lastN);
        start = Math.max(start, 0); // 确保start不小于0
        // 使用range方法获取列表中指定范围的元素
        List<Object> objects = redisTemplate.opsForList().range(key, start, -1);
        if (objects == null) {
            return List.of(); // 返回空列表
        }
        // 将 List<Object> 转换为 List<Message>
        return objects.stream()
                .filter(obj -> obj instanceof Message) // 确保每个对象都是 Message 类型
                .map(obj -> (Message) obj) // 转换为 Message 类型
                .collect(Collectors.toList());
    }

    @Override
    public void clear(String conversationId) {
        String key = REDIS_KEY_PREFIX + conversationId;
        // 直接删除整个对话的Key
        redisTemplate.delete(key);
    }
}
